#pragma once

/// 顺序栈类型定义
template <typename E, int M>
struct SqStack
{
    E elem[M];
    int top;
};

///顺序栈的基本操作

/// 初始化栈为空 Initstack(&S)
template <typename E, int M>
void InitStack(SqStack<E, M> &S)
{
    S.top = 0;
}

///判断栈是否为空 StackEmpty(s)
template <typename E, int M>
bool StackEmpty(const SqStack<E, M> &s)
{
    return s.top == 0;
}

/// 入栈 Push(&S,e)
template <typename E, int M>
void Push(SqStack<E, M> &S, E e)
{
    //若栈满，则抛出异常
    if (S.top == M)
        throw "Stack full";
    //否则。入栈
    S.elem[S.top++] = e;
}

///出栈 Pop(&s,&e)
template <typename E, int M>
void Pop(SqStack<E, M> &S, E &e)
{
    //若栈空，则抛出异常
    if (S.top == 0)
        throw "Stack empty";
    //否则，出栈
    e = S.elem[--S.top];
}

// /// 出栈 Pop(&s) 返回栈顶元素
// tepplate<typename E, int M>
//E Pop(SqStack<E,M> &S)
//{
//    // 若栈空，则抛出异常
//    if (s.top == 0) thorw "Stack empty" ;
//    // 否则，出栈
//    return S.elem[--S.top];


/// 出栈 Pop(&s)
template <typename E, int M>
void Pop(SqStack<E, M> &S)
{
    // 若栈空，则抛出异常
    if (S.top == 0)
        throw "Stack empty";
    // 否则，出栈
    --S.top;
}

/// 取栈顶元素 GetTop(s,&e)
template <typename E, int M>
void GetTop(const SqStack<E, M> &S, E &e)
{
    if (S.top == 0)
        throw "Stack empty";
    // 否则，返回栈顶元素
    e = S.elem[S.top - 1];
}